package jp.co.nes.awssupport.tools.client;

import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jp.co.nes.awssupport.business.bean.ManifestBean;
import jp.co.nes.awssupport.business.utility.ManifestHelper;
import jp.co.nes.awssupport.common.base.AbstractClient;
import jp.co.nes.awssupport.common.utility.PropertiesUtil;

/**
 * s3に配置されている請求CSVのマニュフェストに関する情報を標準出力します。<br>
 * <br>
 * 【クラスパスの設定】
 * awssupport-tools-X.X.X.jar(X.X.Xはバージョン)を設定します。<br>
 * また、log4jの設定ファイルであるlog4j.xmlを、クラスパスのルートに配置する必要があります。<br>
 * <br>
 * 【コマンドライン引数の内容】<br>
 * -b (--bucketName)・・左記オプションに続けて、半角スペース + 請求CSVのマニュフェストに関するバケット名を設定(必須)<br>
 * -o (--objectKey)・・左記オプションに続けて、半角スペース + 請求CSVのマニュフェストに関するオブジェクトキーを設定(必須)<br>
 * <br>
 * 【プロパティの内容(※1)】<br>
 * AccessKey・・s3に接続する際に使用するアクセスキーを設定(必須)<br>
 * SecretKey・・s3に接続する際に使用するシークレットキーを設定(必須)<br>
 * ProxyHost・・s3に接続する際に使用するプロキシサーバのホストを設定(プロキシーが必要な場合のみ必須)<br>
 * ProxyPort・・s3に接続する際に使用するプロキシサーバのポートを設定(プロキシーが必要な場合のみ必須)<br>
 * RegionName・・リージョンを設定(省略可、省略した場合は「ap-northeast-1」)<br>
 * <br>
 * (※1) システムプロパティ or プロパティファイルで設定。両方に設定されていた場合、システムプロパティの内容が優先されます。<br>
 * <br>
 * 【タイムゾーンの設定】<br>
 * タイムゾーンの設定をシステムプロパティに実施する必要があります(-Duser.timezone=UTC)。<br>
 * <br>
 * 【その他】<br>
 * プロパティファイルの仕様・設定については、{@link PropertiesUtil}を参照。<br>
 * LocalTestプロパティにtrueを設定すると、ローカルテスト用動作になり、AWSに接続しないので、本ツールを使用する場合には、
 * LocalTestプロパティは設定しない事。
 */
public class ManifestClient extends AbstractClient {

    /** ロガー */
    private static Logger logger = LoggerFactory.getLogger(ManifestClient.class);

    /** 請求CSVのマニュフェストに関するのバケット名 */
    @Option(name = "-b", aliases = "--bucketName", usage = "バケット名", metaVar = "bucketName", required = true)
    private String bucketName;

    /** 請求CSVのマニュフェストに関するオブジェクトキー */
    @Option(name = "-o", aliases = "--objectKey", usage = "オブジェクトキー", metaVar = "objectKey", required = true)
    private String objectKey;

    /**
     * メインメソッドです。
     *
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        ManifestClient client = new ManifestClient();
        client.execute(args);
    }

    /**
     * デフォルトコンストラクタです。
     */
    public ManifestClient() {
    }

    @Override
    protected void execute() {
        ManifestHelper helper = new ManifestHelper(bucketName, objectKey);
        ManifestBean bean = helper.getManifestBean();
        System.out.println(bean);
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractClient#finish(boolean, java.lang.Throwable)
     */
    @Override
    protected void finish(boolean isSuccess, Throwable throwable) {
        // 特に実装する内容無し
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractClient#debugArgument()
     */
    @Override
    protected void debugArgument() {
        if (logger.isDebugEnabled()) {
            logger.debug("bucketName=" + bucketName);
            logger.debug("objectKey=" + objectKey);
        }
    }
}
